package cn.util.tool;

import com.baidu.aip.contentcensor.AipContentCensor;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;
import org.springframework.stereotype.Service;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.math.BigInteger;
import java.net.Socket;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service("tool")
public class Tool implements ToolBiz,Serializable {


	//加密解密 秘钥
	String key = "hefeiyuanshengtaisonglinnongchang";// 自定义密钥
	/**
	 * 测试
	 */
	@Test
	public void Ceshi(){

		System.out.println(this.Sendemail("1753816109@qq.com", "你好", "sb"));
		// String fanhuiu=Crypto("7808f092326e4b7f986a61be8018f709", 1);
		//Crypto(fanhuiu, 2);
	}


	/**
	 * 支付宝和微信 支付接口
	 *
	 *  开发语言 java(客户端)  易语言(服务端)
	 *  原理：使用Socket通信建立连接
	 *       服务端:
	 *
	 *
	 *
	 * @author Administrator
	 *
	 */
	public String zhifukou(String user_name,String zhifuleixing, String money){
		//状态
		String strat = null;
		try {
			// 1、创建客户端Socket，指定服务器地址和端口
			// Socket socket=new Socket("127.0.0.1",5200);
			Socket socket = new Socket("47.94.222.150", 19730);
			//System.out.println("客户端启动成功");
			// 2、获取输出流，向服务器端发送信息
			// 向本机的19730端口发出客户请求
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			// 由系统标准输入设备构造BufferedReader对象
			PrintWriter write = new PrintWriter(socket.getOutputStream());
			// 由Socket对象得到输出流，并构造PrintWriter对象
			//3、获取输入流，并读取服务器端的响应信息
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			int i=0;
			while (true) {
				// 若从标准输入读入的字符串为 "end"则停止循环
				write.println("user_name="+user_name+"&zhifuleixing="+zhifuleixing+"&money="+money+"&");
				// 将从系统标准输入读入的字符串输出到Server
				write.flush();
				// 在系统标准输出上打印读入的字符串
				if(i<1){
					strat=in.readLine();
					//4、关闭资源
					write.close(); // 关闭Socket输出流
					in.close(); // 关闭Socket输入流
					socket.close(); // 关闭Socket
					break;
				}

			} // 继续循环
		} catch (Exception e) {
			System.out.println("can not listen to:" + e);// 出错，打印出错信息
		}

		return  strat;
	}




	/**
	 * 获取内容图片信息
	 * @param s
	 * @return
	 */
	public  String tupianchuli(String s){
		// 把要匹配的字符串写成正则表达式，然后要提取的字符使用括号括起来
		// 在这里，我们要提取最后一个数字，正则规则就是“一个数字加上大于等于0个非数字再加上结束符”
		////<p style="text-align: center;"><img src="http://localhost:8080/YSTSSM/res/res/images/channel/icompany.jpg.gif"/></p><p><br/></p><p><br/></p><p style="text-align: center;">测试发帖</p><p>
		Pattern pattern = Pattern.compile("<img src=\"(.*?)\"");
		Matcher matcher = pattern.matcher(s);
		if(matcher.find()){
			s=matcher.group(1);
		}else{
			s="res/res/images/channel/wpp.png";
		}
		return s;
	}
	/**
	 *  在指定文本前后添加文本
	 *
	 * @param wenben  传入文本
	 * @param xunzhao 需要被改的文本
	 * @param tianjiaq 在被改文本前面添加
	 * @param tianjiah 在被改文本后面添加
	 * @return
	 */
	public  String jia(String wenben,String xunzhao,String tianjiaq,String tianjiah){
		StringBuffer buf=new StringBuffer();
		try {
			buf.append(wenben);
			int q=buf.indexOf(xunzhao);
			buf.insert(q, tianjiaq);
			int h=buf.lastIndexOf(xunzhao);
			buf.insert(h+xunzhao.length(), tianjiah);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return buf.toString();
	}

	/**
	 * 获取唯一uuid 用户id
	 */
	public  String getUUID() {

		return UUID.randomUUID().toString().replace("-","");
	}
	/**
	 * 获取唯一订单号
	 */
	public  String OrderId(){
		SerialNumber serial = new FileEveryDaySerialNumber(5, "EveryDaySerialNumber.dat");
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return serial.getSerialNumber();
	}


	/**
	 * 自研MD5
	 * @param str
	 * @return
	 */
	public  String getMD5(String str) {
		try {
			// 生成一个MD5加密计算摘要
			MessageDigest md = MessageDigest.getInstance("MD5");
			// 计算md5函数
			md.update(str.getBytes());
			// digest()最后确定返回md5 hash值，返回值为8为字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
			// BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
			StringBuffer stringBuffer = new StringBuffer(new BigInteger(1, md.digest()).toString(16));
			stringBuffer=stringBuffer.insert(3, "q");
			stringBuffer=stringBuffer.insert(6, "i");
			stringBuffer=stringBuffer.insert(9, "n");
			stringBuffer=stringBuffer.insert(11, "g");
			stringBuffer=stringBuffer.insert(15, "g");
			stringBuffer=stringBuffer.insert(11, "e");
			return stringBuffer.toString();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 发送邮件   整合spring 要导入email.jar
	 * @return
	 */
	public boolean  Sendemail(String toemail,String user_name,String weiyiuuid){
		// 发件人的 邮箱 和 密码（替换为自己的邮箱和密码）
		// PS: 某些邮箱服务器为了增加邮箱本身密码的安全性，给 SMTP 客户端设置了独立密码（有的邮箱称为“授权码”）,
		//     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码（授权码）。
		String myEmailAccount = "email@918yst.com";
		String myEmailPassword = "YstHome.1234";
		// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
		// 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
		String myEmailSMTPHost = "smtp.exmail.qq.com";

		// 收件人邮箱（替换为自己知道的有效邮箱）
		// String receiveMailAccount = "1106389464@qq.com";

		// 1. 创建参数配置, 用于连接邮件服务器的参数配置
		Properties props = new Properties();     // 参数配置
		props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议（JavaMail规范要求）
		props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
		props.setProperty("mail.smtp.auth", "true");            // 需要请求认证

		// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
		//     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
		//     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
		/* */
		// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
		//                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
		//                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
		final String smtpPort = "465";
		props.setProperty("mail.smtp.port", smtpPort);
		props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.setProperty("mail.smtp.socketFactory.fallback", "false");
		props.setProperty("mail.smtp.socketFactory.port", smtpPort);


		// 2. 根据配置创建会话对象, 用于和邮件服务器交互
		Session session = Session.getDefaultInstance(props);

		//这里出 log 现已关闭

		session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log

		// 3. 创建一封邮件
		MimeMessage message;
		try {
			message = createMimeMessage(session, myEmailAccount, toemail, user_name,weiyiuuid);
			// 4. 根据 Session 获取邮件传输对象
			Transport transport = session.getTransport();
			// 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
			//
			//    PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
			//           仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
			//           类型到对应邮件服务器的帮助网站上查看具体失败原因。
			//
			//    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
			//           (1) 邮箱没有开启 SMTP 服务;
			//           (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
			//           (3) 邮箱服务器要求必须要使用 SSL 安全连接;
			//           (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
			//           (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
			//
			//    PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
			transport.connect(myEmailAccount, myEmailPassword);

			// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
			transport.sendMessage(message, message.getAllRecipients());

			// 7. 关闭连接
			transport.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}
	/**
	 * 创建一封只包含文本的简单邮件
	 *
	 * @param session 和服务器交互的会话
	 * @param sendMail 发件人邮箱
	 * @param receiveMail 收件人邮箱
	 * @return
	 * @throws Exception
	 */
	private  MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail,String user_name,String weiyiuuid) throws Exception {
		// 1. 创建一封邮件
		MimeMessage message = new MimeMessage(session);

		// 2. From: 发件人
		message.setFrom(new InternetAddress(sendMail, "918原生态", "UTF-8"));

		// 3. To: 收件人（可以增加多个收件人、抄送、密送）
		message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));

		// 4. Subject: 邮件主题
		message.setSubject("918原生态-注册激活", "UTF-8");
		String activeUrl="http://122.152.216.48/emailyan?userid="+weiyiuuid+"&name="+user_name;
		// 5. Content: 邮件正文（可以使用html标签）
		message.setContent("<tbody><tr><td><img src=\"http://122.152.216.48/res/res/images/logo.png\" width=\"600\" height=\"109\"></td></tr><tr><td valign=\"top\"><table width=\"96%\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr></tr><tr><td class=\"text2\"><strong>亲爱的<font size=\"2\">"+user_name+"</font>会员：</strong><br>您好！感谢您注册918原生态。只差最后一步就可以成为原生态的正式会员,<span class=\"text3\">请点击下面链接激活您的账号：</span><a href=\""+activeUrl+"\" target=\"_blank\">"+activeUrl+"</a><br>您也可以把上述链接地址粘贴到浏览器中，然后回车激活。</td></tr><tr><td bgcolor=\"#FEFEF6\" class=\"text2\">　　<p>请您记住用户名和密码。您可以<a href=\"\" target=\"_blank\">登录原生态购物网</a>，<a href=\"\" target=\"_blank\">修改您的登录密码</a>，<a href=\"\" target=\"_blank\">查询您的订单</a>,请您保管好这封邮件！<br><br><a href=\"http://www.918yst.com\" target=\"_blank\">访问918原生态</a><br>&gt;&gt;&gt;客服邮箱：<a href=\"mailto:918yst@qinggelt.com\" target=\"_blank\">918yst@qinggelt.com</a><p></p></td></tr><tr><td height=\"10\"></td></tr></tbody></table></td></tr><tr><td height=\"3\" bgcolor=\"#712F33\"></td></tr><tr><td height=\"50\">&nbsp;</td></tr></tbody>", "text/html;charset=UTF-8");

		// 6. 设置发件时间
		message.setSentDate(new Date());

		// 7. 保存设置
		message.saveChanges();

		return message;
	}



	/**
	 * 创建文件夹
	 * name 用户名当做文件夹
	 * path 创建的目录
	 *   userid 当做属性存文件夹里  用于区分有些文件让不让别人访问  (暂时不需要转变思想)
	 */

	public void Createfolder(String name,String path){
		//这里 网站安装的时候在创建
		File file=new File(path+"/res/userandinfo");
		if(!file.isFile()){
			file.mkdir();// 创建主目录
		}else{
			//存在主目录
			File userfile=new File(path+"/res/userandinfo"+"/"+name);
			if(!userfile.isFile()){
				userfile.mkdir();// 创建用户文件夹
				File userimg=new File(userfile.getPath()+"/imgs");
				userimg.mkdir();//创建图片目录
			}

		}



	}
	/**
	 * 字符串加密 解密
	 *
	 * @param test
	 * @param type  1加密   2解密
	 * @return
	 */
	public String Crypto(String test,int type){
		String fanhui="";
		try {
			EncryptUtil des = new EncryptUtil(key, "utf-8");
			switch (type) {
				case 1:
					fanhui=des.encode(test);
					break;
				case 2:
					fanhui=des.decode(test);
					break;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return fanhui;
	}

	public String getIpAddr(HttpServletRequest request) {
		       String ip = request.getHeader("x-forwarded-for");
		        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			            ip = request.getHeader("Proxy-Client-IP");
			        }
		       if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			           ip = request.getHeader("WL-Proxy-Client-IP");
			        }
		        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			           ip = request.getRemoteAddr();
			        }
		       return ip;
		   }

}
